function u = enforce_constraints(u, d_min, Ct_bounds)
    % 约束投影，确保粒子满足最小距离约束，并在可行范围内
    % u: 粒子位置向量 [t1x, t1y, t2x, t2y, ..., rx, ry]
    % d_min: 最小距离
    % Ct_bounds: 发射天线的可行范围，形如 [x_min, x_max; y_min, y_max]

    % 提取天线信息
    N = length(u) / 2;           % 发射天线的个数
    t = reshape(u, [2, N]);      % 发射天线坐标 [2 × N]
    
    % 提取 y 坐标并排序
    t_line1_ori = t(2, :);       % 原始 y 坐标向量
    t_line1 = sort(t_line1_ori); % 对 y 坐标进行排序

    % 可行范围的 y 值
    y_min = Ct_bounds(2, 1);
    y_max = Ct_bounds(2, 2);

    % 确保第一个天线在可行范围内
    t_line1(1) = max(t_line1(1), y_min);

    % 调整相邻天线以满足最小距离约束
    for i = 2:N
        t_line1(i) = max(t_line1(i), t_line1(i-1) + d_min);
        % 确保调整后不超过最大边界
        if t_line1(i) > y_max
            t_line1(i) = y_max;
            % 如果达到边界，需要向前调整前面的天线
            for j = i-1:-1:1
                t_line1(j) = t_line1(j+1) - d_min;
                if t_line1(j) < y_min
                    t_line1(j) = y_min;
                    break;
                end
            end
        end
    end

    % 将调整后的 y 坐标赋回原数组
    t(2, :) = t_line1;
    % t_line1
    % 更新位置向量
    u = t(:);
end
